#实现一个学生管理系统

import sys
import os.path

#使用全局变量，来管理学生，每一个字典就是一个学生
students=[]

#菜单
def menu():
    print('+---------------------------------------------------------+')
    print('|                  欢迎来到学生管理系统！                      |')
    print('|   1.新增学生        2.显示学生         3.查找学生            |')
    print('|   4.删除学生        0.退出程序                              |')
    print('+---------------------------------------------------------+')
    choice=input('请输入你的选择：')
    return int(choice)

#存档
def save():
    """
    用于存档
    """
    # 此处的路径不是以 d: 开头的 "绝对路径" , 而是相对路径.
    # 此时这个写法的含义就是让 record.txt 和 当前的 code66.py 在同一个目录里.
    with open('record.txt','w',encoding='utf-8') as f:
        for s in students:
            f.write(f"{s['studentId']}\t{s['name']}\t{s['gender']}\t{s['className']}\n")
        print(f'[存档成功] 共存储了 {len(students)} 条记录!')


def load():
    """
        用于读档
        """
    # 如果存档文件不存在, 则直接跳过读档流程.
    # 为了避免读方式打开文件的时候, 文件不存在引起异常.
    if not os.path.exists('record.txt'):
        return

    # 读档的时候要保证先把旧的数据给清理干净!
    global students
    with open('record.txt','r',encoding='utf-8') as f:
        for line in f:
            # 针对这一行数据, 按照 \t 进行切分操作!
            # 切分之前, 要去除末尾的换行.
            line = line.strip()
            tokens = line.split('\t')
            if len(tokens) != 4:
                print(f'当前行格式存在问题! line={line}')
                continue
            student = {
                'studentId': tokens[0],
                'name': tokens[1],
                'gender': tokens[2],
                'className': tokens[3]
            }
            students.append(student)
            print(f'[读档成功] 共读取了 {len(students)} 条记录!')


def insert():
    print('[新增学生] 开始！')
    studentId=input('请输入这个学生的学号：')
    name=input('请输入这个学生的姓名：')
    gender=input('请输入这个学生的性别：')
    if gender not in ('男','女'):
        print('你的输入有误')
        return
    className=input('请输入这个学生所在的班级：')
    # 使用一个字典把上述的信息给聚合起来.
    student={
        'studentId':studentId,
        'name':name,
        'gender':gender,
        'className':className,
    }
    global students
    students.append(student)
    save()
    print('[新增学生] 完毕！')


def show():
    # 遍历全局变量的这个列表, 把每个学生的信息给打印出来.
    print('[显示学生] 开始！')
    for s in students:
        print(f"[{s['studentId']}]\t{s['name']}\t{s['gender']}\t{s['className']}")
    print(f'[显示学生] 完毕！，总显示了{len(students)}条数据！')


def find():
    #根据学生的姓名，进行查找
    print('[查找学生] 开始！')
    name=input('请输入你要查找学生的姓名：')
    count=0
    for s in students:
        if s['name']==name:
            print(f"[{s['studentId']}]\t{s['name']}\t{s['gender']}\t{s['className']}")
    print(f'[查找学生] 完毕！,总共查找到{count}条匹配的数据')

def delete():
    #根据学号，来进行删除操作
    print('[删除学生] 开始！')
    studentId=input('请输入你要删除学生的学号：')
    for s in students:
        if studentId==s['studentId']:
            print(f"删除 {s['name']} 同学的信息!")
            students.remove(s)
    save()
    print('[删除学生] 完毕！')


def main():
    # 需要在程序启动的时候调用 load 即可~
    load()
    while True:
        choice=menu()
        if choice==1:
            insert()
        elif choice==2:
            show()
        elif choice==3:
            find()
        elif choice==4:
            delete()
        elif choice==0:
            print('goodbye')
            sys.exit(0)
        else:
            print('你的选择有误，请重新选择！')
            #结束这层循环，进入下层循环
            #continue


main()